// 需求，a是什么类型，返回值就是什么类型
// 泛型：定义一个变量代表某类型，使用的时候传入相应类型
// 函数的泛型怎么用
/*
用法:
  function fn<T>(a:T):T{
     return a
  }
  fn<string>('hello')
*/
function fn<T> (a: T): T {
  return a
}
fn<string>('hello')
fn<number>(123)

// const arr: number[] = [1, 2, 3]
// const arr2: Array<number> = [1, 2, 3]

// 类型别名的泛型
// 用法  type 变量名<T>={data:T}  const res:变量名<number[]>={data:[1,2,3]}

type xxx<T> = {
  code: number
  data: T
  message: string
}

const res: xxx<string> = {
  code: 200,
  data: 'asfasfjh-asdgfsadg',
  message: '请求成功'
}
const res2: xxx<number[]> = {
  code: 200,
  data: [1, 2, 3],
  message: '请求成功'
}

// 接口类型的泛型
interface ApiRes<T> {
  code: number
  data: T
}

const res3: ApiRes<string> = {
  code: 200,
  data: 'abc'
}

export {}
